#define F_CPU 20000000

#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdlib.h>

uint8_t data[10];

void init ();
void sendbyusart (uint8_t *data, uint8_t n);
uint8_t connectionwatch ();

int main (void)
{
  init();

  if (connectionwatch())
    sei ();
  
  while (1)
    ;
  
  
  return 0;
}

uint8_t connectionwatch2 ()
{
  char serialbuf[101];
  int i;

  for (i = 0; i < 100; i++){
    while ((UCSR0A & (1 << RXC0)) == 0)
      ;	/* czekaj az cos bedzie do odebrania */
    
    if ((serialbuf[i] = UDR0) == 0x0a){
	serialbuf[++i] = '\0';
	break;
    }
  }

  if (!strstr (serialbuf, "CONNECT"))
    return 0;
  else
    return 1;
}

uint8_t connectionwatch ()
{
  char serialbuf[101];
  int i;

  for (i = 0; i < 100; i++){
      while ((UCSR0A & (1 << RXC0)) == 0)
	;
      if (!(serialbuf[i] = UDR0))
	i--;

      if (strstr(serialbuf, "CON"))
	{
	  _delay_ms (200);
	  return 1;
	}
  }
  return 0;
}

void init ()
{
  DDRC |= _BV(PC5); /* pin z dioda jako output */
  PORTC |= _BV(PC5);

//  EIMSK |= (1 << INT0);	/* INT0 enable */

  /* USART */
  UCSR0B |= _BV (TXEN0) | _BV (RXEN0);  /* odpala modem szeregowy */
  UCSR0C |= _BV (UCSZ00) | _BV (UCSZ01);  /* ustawia rozmiar ramki na 8 */
  UBRR0L = 129;	/* baudrate na 9600 */

  /* timer0 */
  TCCR0A |= _BV (WGM01);  /* CTC mode */
  OCR0A = 195;
  TCCR0B |= _BV (CS02) | _BV (CS00);  /* ext. clock i prescaler 1024 */
  TIMSK0 |= _BV (OCIE0A); /* timer interrupt enable */

  /* ADC */
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  ADMUX |= (1 << REFS0);

  ADCSRA |= (1 << ADATE); /* auto trigger enable */
  ADCSRA |= (1 << ADEN);  /* ADC enable */
  ADCSRA |= (1 << ADSC);  /* start conversion */

}

void sendbyusart (uint8_t *data, uint8_t n)
{
  uint8_t i = 0;

  for (i = 0; i < n; i++){
      while ((UCSR0A & (1 << UDRE0)) == 0)
	; /* czekaj az bufor wysylania bedzie gotowy na dane */
      UDR0 = data[i]; /* URD0 to bufor szeregowego */
  }
}

ISR (TIMER0_COMPA_vect)
{
  uint8_t mux;
  
  for (mux = 0; mux < 5; mux++){
      ADMUX &= 0xF0;
      ADMUX |= (mux & 0x0F);
      _delay_ms(1);

      data[2*mux + 1] = ADCL;
      data[2*mux] = ADCH;
  }

  sendbyusart (&data[4], 2);
  sendbyusart (&data[6], 2);
  sendbyusart (&data[8], 2);
 
  data[8] = 0xFE;
  sendbyusart (&data[8], 1);
 
  sendbyusart (&data[2], 2);
  sendbyusart (&data[0], 2);
 
  data[0] = 0xFF;
  sendbyusart (&data[0], 1);
}

/* INVALID
 *
 * program naprawde rusza dopiero po wywolaniu przerwania na linii INT0,
 * dopiero wtedy ustawiana jest flaga wlaczajaca przerwania TIMER0, wg ktorego
 * zbierane i wysylane sa dane z ADC.
 */

ISR (INT0_vect)
{
  PORTC ^= _BV (PC5);
  EIMSK &= ~(1 << INT0);  /* INT0 disable */
  TIMSK0 |= _BV (OCIE0A); /* timer interrupt enable */
}
